package com.waikuai.shop.controller;

import com.waikuai.shop.common.result.Result;
import com.waikuai.shop.service.HomeService;
import com.waikuai.shop.vo.HomePageVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

/**
 * 首页控制器
 * @author waikuai
 */
@Slf4j
@RestController
@RequestMapping("/home")
@RequiredArgsConstructor
public class HomeController {

    private final HomeService homeService;

    /**
     * 获取首页数据（游客模式）
     */
    @GetMapping("/guest")
    public Result<HomePageVO> getHomePageDataForGuest() {
        try {
            HomePageVO homePageData = homeService.getHomePageDataForGuest();
            log.info("获取首页数据成功，游客模式");
            return Result.success("获取首页数据成功", homePageData);
        } catch (Exception e) {
            log.error("获取首页数据失败: {}", e.getMessage(), e);
            return Result.error("获取首页数据失败");
        }
    }

    /**
     * 获取首页数据
     */
    @GetMapping
    public Result<HomePageVO> getHomePageData(HttpServletRequest request) {
        try {
            // 从JWT令牌中获取用户ID（这里需要根据实际JWT解析方式调整）
            Long userId = getUserIdFromToken(request);

            HomePageVO homePageData;
            if (userId != null) {
                // 登录用户模式
                homePageData = homeService.getHomePageData(userId);
                log.info("获取首页数据成功，用户ID: {}", userId);
            } else {
                // 游客模式
                homePageData = homeService.getHomePageDataForGuest();
                log.info("获取首页数据成功，游客模式");
            }

            return Result.success("获取首页数据成功", homePageData);
        } catch (Exception e) {
            log.error("获取首页数据失败: {}", e.getMessage(), e);
            return Result.error("获取首页数据失败");
        }
    }

    /**
     * 获取首页数据（指定用户）
     */
    @GetMapping("/user/{userId}")
    public Result<HomePageVO> getHomePageDataByUserId(@PathVariable Long userId) {
        try {
            HomePageVO homePageData = homeService.getHomePageData(userId);
            log.info("获取指定用户首页数据成功，用户ID: {}", userId);
            return Result.success("获取首页数据成功", homePageData);
        } catch (Exception e) {
            log.error("获取指定用户首页数据失败，用户ID: {}, 错误: {}", userId, e.getMessage(), e);
            return Result.error("获取首页数据失败");
        }
    }

    /**
     * 刷新首页数据缓存
     */
    @PostMapping("/refresh")
    public Result<String> refreshHomePageCache(HttpServletRequest request) {
        try {
            Long userId = getUserIdFromToken(request);
            if (userId != null) {
                homeService.refreshHomePageCache(userId);
                log.info("刷新首页缓存成功，用户ID: {}", userId);
                return Result.success("刷新首页缓存成功");
            } else {
                return Result.error("用户未登录");
            }
        } catch (Exception e) {
            log.error("刷新首页缓存失败: {}", e.getMessage(), e);
            return Result.error("刷新首页缓存失败");
        }
    }

    /**
     * 获取系统公告
     */
    @GetMapping("/announcement")
    public Result<String> getSystemAnnouncement() {
        try {
            // 这里可以从数据库或配置文件中获取系统公告
            String announcement = "欢迎使用员工关怀在线商城！这里有最新的福利信息和热门商品推荐。";
            return Result.success("获取系统公告成功", announcement);
        } catch (Exception e) {
            log.error("获取系统公告失败: {}", e.getMessage(), e);
            return Result.error("获取系统公告失败");
        }
    }

    /**
     * 获取热门搜索关键词
     */
    @GetMapping("/hot-searches")
    public Result<String[]> getHotSearches() {
        try {
            // 这里可以从数据库统计中获取热门搜索关键词
            String[] hotSearches = {"大米", "食用油", "抽纸", "洗衣液", "牛奶", "面包", "水果", "零食"};
            return Result.success("获取热门搜索成功", hotSearches);
        } catch (Exception e) {
            log.error("获取热门搜索失败: {}", e.getMessage(), e);
            return Result.error("获取热门搜索失败");
        }
    }

    /**
     * 健康检查接口
     */
    @GetMapping("/health")
    public Result<String> health() {
        return Result.success("系统运行正常", "OK");
    }

    /**
     * 从请求中获取用户ID
     * 这里需要根据实际的JWT验证方式来实现
     * @param request HTTP请求
     * @return 用户ID
     */
    private Long getUserIdFromToken(HttpServletRequest request) {
        // 这里需要实现从JWT Token中解析用户ID的逻辑
        // 暂时返回null，后续实现JWT解析时再完善
        String token = request.getHeader("Authorization");
        if (token != null && token.startsWith("Bearer ")) {
            // 解析JWT Token获取用户ID
            // 这里暂时返回一个测试用户ID
            return 2L; // 测试用户ID
        }
        return null;
    }
}